managarten/apps-archived/maerchenzauber/apps/mobile/README/ExpoImageReadMe.md
Till-JS 61d181fbc2 chore: archive inactive projects to apps-archived/
Move inactive projects out of active workspace:
- bauntown (community website)
- maerchenzauber (AI story generation)
- memoro (voice memo app)
- news (news aggregation)
- nutriphi (nutrition tracking)
- reader (reading app)
- uload (URL shortener)
- wisekeep (AI wisdom extraction)

Update CLAUDE.md documentation:
- Add presi to active projects
- Document archived projects section
- Update workspace configuration

Archived apps can be re-activated by moving back to apps/

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 07:03:59 +01:00

672 lines
26 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Expo Image
A cross-platform and performant React component that loads and renders images.
expo-image is a cross-platform React component that loads and renders images.
Main features:
Designed for speed
Support for many image formats (including animated ones)
Disk and memory caching
Supports BlurHash and ThumbHash - compact representations of a placeholder for an image
Transitioning between images when the source changes (no more flickering!)
Implements the CSS object-fit and object-position properties (see contentFit and contentPosition props)
Uses performant SDWebImage and Glide under the hood
Supported image formats
Format Android iOS Web
WebP
PNG / APNG
AVIF
HEIC not adopted yet
JPEG
GIF
SVG
ICO
ICNS
Installation
Terminal
Copy
npx expo install expo-image
If you are installing this in an existing React Native app, start by installing expo in your project. Then, follow the additional instructions as mentioned by the library's README under "Installation in bare React Native projects" section.
Usage
import { Image } from 'expo-image';
import { StyleSheet, View } from 'react-native';
const blurhash =
'|rF?hV%2WCj[ayj[a|j[az_NaeWBj@ayfRayfQfQM{M|azj[azf6fQfQfQIpWXofj[ayj[j[fQayWCoeoeaya}j[ayfQa{oLj?j[WVj[ayayj[fQoff7azayj[ayj[j[ayofayayayj[fQj[ayayj[ayfjj[j[ayjuayj[';
export default function App() {
return (
<View style={styles.container}>
<Image
style={styles.image}
source="https://picsum.photos/seed/696/3000/2000"
placeholder={{ blurhash }}
contentFit="cover"
transition={1000}
/>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#fff',
alignItems: 'center',
justifyContent: 'center',
},
image: {
flex: 1,
width: '100%',
backgroundColor: '#0553',
},
});
Show More
API
import { Image } from 'expo-image';
Components
Image
Type: React.PureComponent<ImageProps>
Some props are from React Native Image that Expo Image supports (more or less) for easier migration, but all of them are deprecated and might be removed in the future.
ImageProps
accessibilityLabel
OptionalType: stringDefault: undefined
The text that's read by the screen reader when the user interacts with the image. Sets the the alt tag on web which is used for web crawlers and link traversal.
accessible
OptionalType: booleanDefault: false
When true, indicates that the view is an accessibility element. When a view is an accessibility element, it groups its children into a single selectable component.
On Android, the accessible property will be translated into the native isScreenReaderFocusable, so it's only affecting the screen readers behaviour.
allowDownscaling
OptionalType: booleanDefault: true
Whether the image should be downscaled to match the size of the view container. Turning off this functionality could negatively impact the application's performance, particularly when working with large assets. However, it would result in smoother image resizing, and end-users would always have access to the highest possible asset quality.
Downscaling is never used when the contentFit prop is set to none or fill.
alt
OptionalType: stringDefault: undefined
The text that's read by the screen reader when the user interacts with the image. Sets the the alt tag on web which is used for web crawlers and link traversal. Is an alias for accessibilityLabel.
autoplay
OptionalType: booleanDefault: true
Determines if an image should automatically begin playing if it is an animated image.
blurRadius
OptionalType: numberDefault: 0
The radius of the blur in points, 0 means no blur effect. This effect is not applied to placeholders.
cachePolicy
OptionalType: null | 'none' | 'disk' | 'memory' | 'memory-disk'Default: 'disk'
Determines whether to cache the image and where: on the disk, in the memory or both.
'none' - Image is not cached at all.
'disk' - Image is queried from the disk cache if exists, otherwise it's downloaded and then stored on the disk.
'memory' - Image is cached in memory. Might be useful when you render a high-resolution picture many times. Memory cache may be purged very quickly to prevent high memory usage and the risk of out of memory exceptions.
'memory-disk' - Image is cached in memory, but with a fallback to the disk cache.
contentFit
OptionalType: ImageContentFitDefault: 'cover'
Determines how the image should be resized to fit its container. This property tells the image to fill the container in a variety of ways; such as "preserve that aspect ratio" or "stretch up and take up as much space as possible". It mirrors the CSS object-fit property.
'cover' - The image is sized to maintain its aspect ratio while filling the container box. If the image's aspect ratio does not match the aspect ratio of its box, then the object will be clipped to fit.
'contain' - The image is scaled down or up to maintain its aspect ratio while fitting within the container box.
'fill' - The image is sized to entirely fill the container box. If necessary, the image will be stretched or squished to fit.
'none' - The image is not resized and is centered by default. When specified, the exact position can be controlled with contentPosition prop.
'scale-down' - The image is sized as if none or contain were specified, whichever would result in a smaller concrete image size.
contentPosition
OptionalType: ImageContentPositionDefault: 'center'
It is used together with contentFit to specify how the image should be positioned with x/y coordinates inside its own container. An equivalent of the CSS object-position property.
decodeFormat
OptionalType: ImageDecodeFormatDefault: 'argb'
The format in which the image data should be decoded. It's not guaranteed that the platform will use the specified format.
'argb' - The image is decoded into a 32-bit color space with alpha channel (https://developer.android.com/reference/android/graphics/Bitmap.Config#ARGB_8888).
'rgb' - The image is decoded into a 16-bit color space without alpha channel (https://developer.android.com/reference/android/graphics/Bitmap.Config#RGB_565).
Deprecated Provides compatibility for defaultSource from React Native Image. Use placeholder prop instead.
defaultSource
OptionalType: null | ImageSource
enableLiveTextInteraction
OptionalType: booleanDefault: false
Enables Live Text interaction with the image. Check official Apple documentation for more details.
Deprecated Provides compatibility for fadeDuration from React Native Image. Instead use transition with the provided duration.
fadeDuration
OptionalType: number
focusable
OptionalType: booleanDefault: false
Whether this View should be focusable with a non-touch input device and receive focus with a hardware keyboard.
Deprecated Provides compatibility for loadingIndicatorSource from React Native Image. Use placeholder prop instead.
loadingIndicatorSource
OptionalType: null | ImageSource
onDisplay
OptionalType: () => void
Called when the image view successfully rendered the source image.
onError
OptionalType: (event: ImageErrorEventData) => void
Called on an image fetching error.
onLoad
OptionalType: (event: ImageLoadEventData) => void
Called when the image load completes successfully.
onLoadEnd
OptionalType: () => void
Called when the image load either succeeds or fails.
onLoadStart
OptionalType: () => void
Called when the image starts to load.
onProgress
OptionalType: (event: ImageProgressEventData) => void
Called when the image is loading. Can be called multiple times before the image has finished loading. The event object provides details on how many bytes were loaded so far and what's the expected total size.
placeholder
OptionalType: null | string | number | ImageSource | SharedRef<'image', Record<never, never>> | ImageSource[] | string[]
An image to display while loading the proper image and no image has been displayed yet or the source is unset.
placeholderContentFit
OptionalType: ImageContentFitDefault: 'scale-down'
Determines how the placeholder should be resized to fit its container. Available resize modes are the same as for the contentFit prop.
priority
OptionalType: null | 'low' | 'normal' | 'high'Default: 'normal'
Priorities for completing loads. If more than one load is queued at a time, the load with the higher priority will be started first. Priorities are considered best effort, there are no guarantees about the order in which loads will start or finish.
recyclingKey
OptionalType: null | stringDefault: null
Changing this prop resets the image view content to blank or a placeholder before loading and rendering the final image. This is especially useful for any kinds of recycling views like FlashList to prevent showing the previous source before the new one fully loads.
Deprecated Provides compatibility for resizeMode from React Native Image. Note that "repeat" option is not supported at all. Use the more powerful contentFit and contentPosition props instead.
resizeMode
OptionalType: 'cover' | 'contain' | 'center' | 'stretch' | 'repeat'
responsivePolicy
OptionalType: 'live' | 'initial' | 'static'Default: 'static'
Controls the selection of the image source based on the container or viewport size on the web.
If set to 'static', the browser selects the correct source based on user's viewport width. Works with static rendering. Make sure to set the 'webMaxViewportWidth' property on each source for best results. For example, if an image occupies 1/3 of the screen width, set the 'webMaxViewportWidth' to 3x the image width. The source with the largest 'webMaxViewportWidth' is used even for larger viewports.
If set to 'initial', the component will select the correct source during mount based on container size. Does not work with static rendering.
If set to 'live', the component will select the correct source on every resize based on container size. Does not work with static rendering.
source
OptionalType: null | string | number | ImageSource | SharedRef<'image', Record<never, never>> | ImageSource[] | string[]
The image source, either a remote URL, a local file resource or a number that is the result of the require() function. When provided as an array of sources, the source that fits best into the container size and is closest to the screen scale will be chosen. In this case it is important to provide width, height and scale properties.
tintColor
OptionalType: null | stringDefault: null
A color used to tint template images (a bitmap image where only the opacity matters). The color is applied to every non-transparent pixel, causing the images shape to adopt that color. This effect is not applied to placeholders.
transition
OptionalType: null | number | ImageTransition
Describes how the image view should transition the contents when switching the image source.
If provided as a number, it is the duration in milliseconds of the 'cross-dissolve' effect.
Inherited Props
Omit<ViewProps, 'style'>
ImageBackground
Type: React.Element<ImageBackgroundProps>
ImageBackgroundProps
imageStyle
OptionalType: StyleProp<ImageStyle>
Style object for the image
style
OptionalType: StyleProp<ViewStyle>
The style of the image container
Inherited Props
Omit<ImageProps, 'style'>
Static Methods
clearDiskCache()
Asynchronously clears all images from the disk cache.
Returns:
Promise<boolean>
A promise resolving to true when the operation succeeds. It may resolve to false on Android when the activity is no longer available. Resolves to false on Web.
clearMemoryCache()
Asynchronously clears all images stored in memory.
Returns:
Promise<boolean>
A promise resolving to true when the operation succeeds. It may resolve to false on Android when the activity is no longer available. Resolves to false on Web.
generateBlurhashAsync(url, numberOfComponents)
Parameter Type Description
url string
The URL of the image to generate a blurhash from.
numberOfComponents
[number, number] | {
height: number,
width: number
}
The number of components to encode the blurhash with. Must be between 1 and 9. Defaults to [4, 3].
Asynchronously generates a Blurhash from an image.
Returns:
Promise<null | string>
A promise resolving to the blurhash string.
getCachePathAsync(cacheKey)
Parameter Type Description
cacheKey string
The cache key for the requested image. Unless you have set a custom cache key, this will be the source URL of the image.
Asynchronously checks if an image exists in the disk cache and resolves to the path of the cached image if it does.
Returns:
Promise<null | string>
A promise resolving to the path of the cached image. It will resolve to null if the image does not exist in the cache.
loadAsync(source, options)
Parameter Type
source string | ImageSource
options
(optional)
ImageLoadOptions
Loads an image from the given source to memory and resolves to an object that references the native image instance.
Returns:
Promise<ImageRef>
prefetch(urls, cachePolicy)
Parameter Type Description
urls string | string[]
A URL string or an array of URLs of images to prefetch.
cachePolicy
(optional)
'disk' | 'memory' | 'memory-disk'
The cache policy for prefetched images.
Preloads images at the given URLs that can be later used in the image view. Preloaded images are cached to the memory and disk by default, so make sure to use disk (default) or memory-disk cache policy.
Returns:
Promise<boolean>
A promise resolving to true as soon as all images have been successfully prefetched. If an image fails to be prefetched, the promise will immediately resolve to false regardless of whether other images have finished prefetching.
prefetch(urls, options)
Parameter Type Description
urls string | string[]
A URL string or an array of URLs of images to prefetch.
options
(optional)
ImagePrefetchOptions
Options for prefetching images.
Preloads images at the given URLs that can be later used in the image view. Preloaded images are cached to the memory and disk by default, so make sure to use disk (default) or memory-disk cache policy.
Returns:
Promise<boolean>
A promise resolving to true as soon as all images have been successfully prefetched. If an image fails to be prefetched, the promise will immediately resolve to false regardless of whether other images have finished prefetching.
Component Methods
getAnimatableRef()
Reanimated support on web
Returns:
any
startAnimating()
Asynchronously starts playback of the view's image if it is animated.
Returns:
Promise<void>
stopAnimating()
Asynchronously stops the playback of the view's image if it is animated.
Returns:
Promise<void>
Hooks
useImage(source, options, dependencies)
Parameter Type
source string | ImageSource
options
(optional)
ImageLoadOptions
dependencies
(optional)
DependencyList
A hook that loads an image from the given source and returns a reference to the native image instance, or null until the first image is successfully loaded.
It loads a new image every time the uri of the provided source changes. To trigger reloads in some other scenarios, you can provide an additional dependency list.
Returns:
ImageRef | null
Example
import { useImage, Image } from 'expo-image';
import { Text } from 'react-native';
export default function MyImage() {
const image = useImage('https://picsum.photos/1000/800', {
maxWidth: 800,
onError(error, retry) {
console.error('Loading failed:', error.message);
}
});
if (!image) {
return <Text>Image is loading...</Text>;
}
return <Image source={image} style={{ width: image.width / 2, height: image.height / 2 }} />;
}
Classes
ImageRef
Type: Class extends SharedRef<'image'>
An object that is a reference to a native image instance Drawable on Android and UIImage on iOS. Instances of this class can be passed as a source to the Image component in which case the image is rendered immediately since its native representation is already available in the memory.
ImageRef Properties
height
Read OnlyType: number
Logical height of the image. Multiply it by the value in the scale property to get the height in pixels.
isAnimated
OptionalRead OnlyType: boolean
Whether the referenced image is an animated image.
mediaType
Read OnlyType: null | string
Media type (also known as MIME type) of the image, based on its format. Returns null when the format is unknown or not supported.
nativeRefType
Type: string
The type of the native reference.
scale
Read OnlyType: number
On iOS, if you load an image from a file whose name includes the @2x modifier, the scale is set to 2.0. All other images are assumed to have a scale factor of 1.0. On Android, it calculates the scale based on the bitmap density divided by screen density.
On all platforms, if you multiply the logical size of the image by this value, you get the dimensions of the image in pixels.
width
Read OnlyType: number
Logical width of the image. Multiply it by the value in the scale property to get the width in pixels.
Types
ImageContentPosition
Specifies the position of the image inside its container. One value controls the x-axis and the second value controls the y-axis.
Additionally, it supports stringified shorthand form that specifies the edges to which to align the image content:
'center', 'top', 'right', 'bottom', 'left', 'top center', 'top right', 'top left', 'right center', 'right top', 'right bottom', 'bottom center', 'bottom right', 'bottom left', 'left center', 'left top', 'left bottom'.
If only one keyword is provided, then the other dimension is set to 'center' ('50%'), so the image is placed in the middle of the specified edge.
As an example, 'top right' is the same as { top: 0, right: 0 } and 'bottom' is the same as { bottom: 0, left: '50%' }.
Type: ImageContentPositionString or object shaped as below:
Property Type Description
right
(optional)
ImageContentPositionValue -
top
(optional)
ImageContentPositionValue -
Or object shaped as below:
Property Type Description
left
(optional)
ImageContentPositionValue -
top
(optional)
ImageContentPositionValue -
Or object shaped as below:
Property Type Description
bottom
(optional)
ImageContentPositionValue -
right
(optional)
ImageContentPositionValue -
Or object shaped as below:
Property Type Description
bottom
(optional)
ImageContentPositionValue -
left
(optional)
ImageContentPositionValue -
ImageContentPositionValue
Literal Type: multiple types
A value that represents the relative position of a single axis.
If number, it is a distance in points (logical pixels) from the respective edge.
If string, it must be a percentage value where '100%' is the difference in size between the container and the image along the respective axis, or 'center' which is an alias for '50%' that is the default value. You can read more regarding percentages on the MDN docs for background-position that describes this concept well.
Acceptable values are: number | string | {number}% | {number} | 'center'
ImageErrorEventData
Property Type Description
error string -
ImageLoadEventData
Property Type Description
cacheType 'none' | 'disk' | 'memory' -
source
{
height: number,
isAnimated: boolean,
mediaType: string | null,
url: string,
width: number
}
- ImageLoadOptions
An object with options for the useImage hook.
Property Type Description
maxHeight
(optional)
number
Only for:
If provided, the image will be automatically resized to not exceed this height in pixels, preserving its aspect ratio.
maxWidth
(optional)
number
Only for:
If provided, the image will be automatically resized to not exceed this width in pixels, preserving its aspect ratio.
onError
(optional)
(error: Error, retry: () => void) => void
Function to call when the image has failed to load. In addition to the error, it also provides a function that retries loading the image.
ImagePrefetchOptions
Property Type Description
cachePolicy
(optional)
'disk' | 'memory-disk' | 'memory'
The cache policy for prefetched images.
Default:
'memory-disk'
headers
(optional)
Record<string, string>
A map of headers to use when prefetching the images.
ImageProgressEventData
Property Type Description
loaded number -
total number -
ImageSource
Property Type Description
blurhash
(optional)
string
A string used to generate the image placeholder. For example, placeholder={blurhash}. If uri is provided as the value of the source prop, this is ignored since the source can only have blurhash or uri.
When using the blurhash, you should also provide width and height (higher values reduce performance), otherwise their default value is 16. For more information, see woltapp/blurhash repository.
cacheKey
(optional)
string
The cache key used to query and store this specific image. If not provided, the uri is used also as the cache key.
headers
(optional)
Record<string, string>
An object representing the HTTP headers to send along with the request for a remote image. On web requires the Access-Control-Allow-Origin header returned by the server to include the current domain.
height
(optional)
number
Can be specified if known at build time, in which case the value will be used to set the default <Image/> component dimension.
isAnimated
(optional)
boolean
Only for:
Whether the image is animated (an animated GIF or WebP for example).
thumbhash
(optional)
string
A string used to generate the image placeholder. For example, placeholder={thumbhash}. If uri is provided as the value of the source prop, this is ignored since the source can only have thumbhash or uri.
For more information, see thumbhash website.
uri
(optional)
string
A string representing the resource identifier for the image, which could be an HTTPS address, a local file path, or the name of a static image resource.
webMaxViewportWidth
(optional)
number
Only for:
The max width of the viewport for which this source should be selected. Has no effect if source prop is not an array or has only 1 element. Has no effect if responsivePolicy is not set to static. Ignored if blurhash or thumbhash is provided (image hashes are never selected if passed in an array).
width
(optional)
number
Can be specified if known at build time, in which case the value will be used to set the default <Image/> component dimension.
ImageTransition
An object that describes the smooth transition when switching the image source.
Property Type Description
duration
(optional)
number
The duration of the transition in milliseconds.
Default:
0
effect
(optional)
'cross-dissolve' | 'flip-from-top' | 'flip-from-right' | 'flip-from-bottom' | 'flip-from-left' | 'curl-up' | 'curl-down' | null
An animation effect used for transition.
Default:
'cross-dissolve' On Android, only `'cross-dissolve'` is supported. On Web, `'curl-up'` and `'curl-down'` effects are not supported.
timing
(optional)
'ease-in-out' | 'ease-in' | 'ease-out' | 'linear'
Specifies the speed curve of the transition effect and how intermediate values are calculated.
Default:
'ease-in-out'
Generating a blurhash on a server
Images can significantly improve the visual experience, however, they can also slow down app/page loading times due to their large file sizes. To overcome this, you can create placeholder images using blurhash algorithm that provides an immersive experience while deferring the loading of the actual picture until later.
This guide demonstrates how to create a blurhash of an uploaded image on the backend using JavaScript and Express.js. The same techniques and principles apply to other languages and server technologies.
Start by installing a few dependencies: multer for handling multipart requests, sharp for converting files to a data buffer, and the official blurhash JavaScript package.
Terminal
Copy
npm install multer sharp blurhash
Next, import all required functions from installed packages and initialize multer:
// Multer is a middleware for handling `multipart/form-data`.
const multer = require('multer');
// Sharp allows you to receive a data buffer from the uploaded image.
const sharp = require('sharp');
// Import the encode function from the blurhash package.
const { encode } = require('blurhash');
// Initialize `multer`.
const upload = multer();
Assuming the app is a variable that holds a reference to the Express server, an endpoint can be created that accepts an image and returns a JSON response containing the generated blurhash.
app.post('/blurhash', upload.single('image'), async (req, res) => {
const { file } = req;
// If the file is not available we're returning with error.
if (file === null) {
res.status(400).json({ message: 'Image is missing' });
return;
}
// Users can specify number of components in each axes.
const componentX = req.body.componentX ?? 4;
const componentY = req.body.componentY ?? 3;
// We're converting provided image to a byte buffer.
// Sharp currently supports multiple common formats like JPEG, PNG, WebP, GIF, and AVIF.
const { data, info } = await sharp(file.buffer).ensureAlpha().raw().toBuffer({
resolveWithObject: true,
});
const blurhash = encode(
new Uint8ClampedArray(data),
info.width,
info.height,
componentX,
componentY
);
res.json({ blurhash });
});
Show More
Additionally, the request can include two parameters: componentX and componentY, are passed through the algorithm. These values can be calculated or hard-coded on the server or specified by the user. However, they must be within the range of 1 to 9 and have an aspect ratio similar to the uploaded image. A value of 9 will give the best results but may take longer to generate the hash.
The process of generating a blurhash can be accomplished in various languages and server technologies, similar to the one using JavaScript. The key step is to locate an encoder for your chosen language, which can often be found in the woltapp/blurhash repository. Once you have the encoder, you will need to obtain a representation of the image. Some libraries use a default image class (for example, the Swift implementation uses UIImage). In other cases, you will have to provide raw byte data. Make sure to check the encoder's documentation to confirm the expected data format.
When working with raw byte data, ensure that the alpha layer is present (each pixel is represented by red, green, blue, and alpha values). Failing to do so will lead to errors such as "width and height must match the pixels array".